<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>10.6 Chain-of-Thought Prompting（思维链提示） - Langchain框架教程</title>
    <link rel="stylesheet" href="../shared_styles.css">
</head>
<body>
    <div class="container">
        <h1> 第十章：AI系统提示词设计进阶</h1>
        <section id="s10-6">
            <h2>10.6 Chain-of-Thought Prompting（思维链提示）</h2>
            <p>Chain-of-Thought Prompting（思维链提示，简称 CoT）是一种提示词技术，它鼓励大型语言模型（LLM）在给出最终答案之前，先生成一系列中间的推理步骤或“思维链”。这种技术显著提高了LLM在需要多步推理的任务上的表现，例如算术、常识和符号操作等。</p>

            <h3>Chain-of-Thought Prompting 的原理</h3>
            <p>传统的提示词方式通常直接要求LLM给出最终答案。然而，对于复杂问题，这就像要求一个人直接跳到结论而不进行思考过程一样困难。CoT提示词通过引导LLM显式地输出其思考过程，使其能够分解问题、逐步推理，并最终得出更准确的答案。</p>
            <p>这种显式的推理过程有几个好处：</p>
            <ul>
                <li><strong>提高准确性：</strong> 通过分解问题并逐步解决，LLM可以减少错误，提高最终答案的准确性。</li>
                <li><strong>增强可解释性：</strong> 思维链提供了LLM如何得出答案的透明视图，这有助于理解模型的推理过程，进行调试和改进。</li>
                <li><strong>处理复杂问题：</strong> CoT使得LLM能够处理那些需要多步逻辑推理才能解决的复杂问题。</li>
            </ul>

            <h3>Chain-of-Thought Prompting 的实现方式</h3>
            <p>实现 CoT Prompting 主要有两种方式：</p>

            <ol>
                <li>
                    <strong>Zero-shot CoT:</strong>
                    <p>这是最简单的方式，只需在提示词末尾添加一句简单的指令，如“让我们一步一步地思考。” (Let's think step by step.)。令人惊讶的是，即使没有提供任何示例，这句话也能显著激发LLM的思维链能力。</p>
                    <pre><code class="language-python">
# (接上一节的Qwen LLM初始化代码)
# from langchain_openai import ChatOpenAI
# from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
# from langchain_core.output_parsers import StrOutputParser
# import os
#
# api_key = os.environ.get("DASHSCOPE_API_KEY")
# qwen_llm = ChatOpenAI(
#     base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
#     api_key=api_key,
#     model="qwen-plus",
#     temperature=0.1
# )

prompt_template_zero_shot_cot = ChatPromptTemplate.from_messages([
    HumanMessagePromptTemplate.from_template("请计算：(15 + 23) * 5 - 10。让我们一步一步地思考。")
])

chain_zero_shot_cot = prompt_template_zero_shot_cot | qwen_llm | StrOutputParser()

# 测试 Zero-shot CoT
question_zero_shot = "(15 + 23) * 5 - 10"
response_zero_shot = chain_zero_shot_cot.invoke({"question": question_zero_shot}) # 注意这里没有使用question变量，直接在模板里写死了
print(f"问题: 请计算：{question_zero_shot}。让我们一步一步地思考。")
print(f"AI输出 (Zero-shot CoT):\n{response_zero_shot}")
                    </code></pre>
                    <p>这种方法无需额外准备示例，易于实现，但在某些复杂任务上效果可能不如Few-shot CoT。</p>
                </li>
                <li>
                    <strong>Few-shot CoT:</strong>
                    <p>这种方式结合了Few-shot Prompting和CoT的思想。在提示词中提供包含问题、思维链和最终答案的示例。通过模仿这些示例，LLM能够学习如何生成自己的思维链。</p>
                    <pre><code class="language-python">
# (接上一节的Qwen LLM初始化代码)
# from langchain_openai import ChatOpenAI
# from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
# from langchain_core.output_parsers import StrOutputParser
# import os
#
# api_key = os.environ.get("DASHSCOPE_API_KEY")
# qwen_llm = ChatOpenAI(
#     base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
#     api_key=api_key,
#     model="qwen-plus",
#     temperature=0.1
# )

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

# 定义包含思维链的示例
cot_examples = [
    {
        "question": "A had 5 apples. B gave A 3 apples. A ate 1 apple. How many apples does A have now?",
        "thought": "A started with 5 apples. B gave A 3 apples, so A has 5 + 3 = 8 apples. A ate 1 apple, so A has 8 - 1 = 7 apples. The final answer is 7.",
        "answer": "7"
    },
    {
        "question": "There are 10 cars in the parking lot. 3 cars left. 2 new cars arrived. How many cars are in the parking lot now?",
        "thought": "There were 10 cars. 3 cars left, so there are 10 - 3 = 7 cars. 2 new cars arrived, so there are 7 + 2 = 9 cars. The final answer is 9.",
        "answer": "9"
    },
]

# 定义单个示例的提示词格式
cot_example_template = """
问题: {question}
思考: {thought}
答案: {answer}
"""
cot_example_prompt = PromptTemplate(
    input_variables=["question", "thought", "answer"],
    template=cot_example_template
)

# 创建 FewShotPromptTemplate for CoT
few_shot_cot_prompt = FewShotPromptTemplate(
    examples=cot_examples,
    example_prompt=cot_example_prompt,
    prefix="请回答以下问题，并给出你的思考过程：",
    suffix="问题: {input_question}\n思考:", # 注意这里只要求输出思考过程，答案通常在思考过程的最后
    input_variables=["input_question"],
    example_separator="\n\n"
)

# 格式化提示词
user_question_cot = "我有12个橘子。我吃了3个。我妈妈给了我5个。我现在有多少个橘子？"
formatted_cot_prompt = few_shot_cot_prompt.format(input_question=user_question_cot)
print(f"格式化后的 Few-shot CoT 提示词:\n{formatted_cot_prompt}")

# 将提示词与LLM连接并调用
cot_chain = few_shot_cot_prompt | qwen_llm | StrOutputParser()

# 测试 Few-shot CoT
response_cot = cot_chain.invoke({"input_question": user_question_cot})
print(f"\n问题: {user_question_cot}")
print(f"AI输出 (Few-shot CoT):\n{response_cot}")
                    </code></pre>
                    <p>Few-shot CoT通常比Zero-shot CoT在复杂推理任务上表现更好，但需要人工准备高质量的示例。</p>
                </li>
            </ol>

            <h3>Chain-of-Thought Prompting 的注意事项</h3>
            <ul>
                <li><strong>任务类型：</strong> CoT对需要多步推理的任务最有效。对于简单的任务，它可能不会带来显著提升，甚至可能增加不必要的复杂性。</li>
                <li><strong>模型能力：</strong> CoT的效果也取决于LLM本身的能力。较小的模型可能难以生成有效的思维链。</li>
                <li><strong>示例质量 (Few-shot CoT):</strong> 提供的示例应包含清晰、逻辑正确的思维链。错误的示例会误导模型。</li>
                <li><strong>指令清晰度：</strong> 无论是Zero-shot还是Few-shot，清晰的指令（如“一步一步地思考”）对于触发CoT行为很重要。</li>
            </ul>

            <h3>总结</h3>
            <p>Chain-of-Thought Prompting是一种强大的技术，通过引导LLM生成中间推理步骤来提高其在复杂任务上的表现。无论是简单的Zero-shot CoT还是需要示例的Few-shot CoT，都能帮助LLM更好地分解问题、进行逻辑推理，并提供更准确和可解释的答案。在处理需要多步思考的问题时，CoT是提示词设计中值得考虑的重要策略。</p>
        </section>

        <div class="navigation">
            <a href="../langchain_tutorial_outline.html">返回教程目录</a>
            <a href="../chapter10/chapter10_5_few_shot_prompting.html">&larr; 上一节：10.5 Few-shot Prompting（少样本提示）</a>
            <a href="../chapter10/chapter10_7_self_consistency.html">下一节：10.7 Self-Consistency（自洽性） &rarr;</a>
        </div>
    </div>
</body>
</html>
</environment_details>
